iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

數位影像處理系列 第 5

[Day 5] 影像的縮放與旋轉

  • 分享至 

  • xImage
  •  

今天要介紹影像的縮放、旋轉。這些操作都會用到一個基礎公式,叫做仿射轉換公式(Affine Transformation)
https://ithelp.ithome.com.tw/upload/images/20220912/20152370SmV4X14jpl.png

其中,T稱為仿射轉換矩陣。根據T的不同就會進行不同的影像操作。


1.影像縮放

影像縮放(Image Scaling)是最基礎簡單的影像處理技術,縮放比例可以是整數或浮點數。定義如下:

https://ithelp.ithome.com.tw/upload/images/20220912/20152370iRVcUQaXYE.png
其中https://chart.googleapis.com/chart?cht=tx&chl=S_xhttps://chart.googleapis.com/chart?cht=tx&chl=S_y稱為縮放比,通常兩者是相同的,以避免數位影像變形。

OpenCV提供影像縮放涵式:

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

各別參數說明如下:

  • src:原始影像
  • dsize:輸出影像大小
  • dst:輸出影像
  • fx:水平軸縮放比例(若為0則依輸出影像大小調整)
  • fy:垂直軸縮放比例(若為0則依輸出影像大小調整)
  • interpolation:所採用的內插法
    INTER_NEAREST – 最鄰近內插法
    INTER_LINEAR – 雙線性內插法(預設)
    INTER_CUBIC – 雙立方內插法

以下程式為將一張圖片根據使用者輸入的縮放比例放大:

import numpy as np
import cv2

img1 = cv2.imread("D:\Desktop\IThome\lena.bmp", -1)

nr,nc = img1.shape[:2]
scale = eval(input("Please enter scale:"))
nr2 = int(nr * scale)
nc2 = int(nc * scale)

img2 = cv2.resize(img1, (nr2,nc2), interpolation = cv2.INTER_NEAREST)
img3 = cv2.resize(img1, (nr2,nc2), interpolation = cv2.INTER_LINEAR)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.imshow("Second", img3)

cv2.waitKey()
cv2.destroyAllWindows()

在這個範例中,根據使用者輸入的scale參數,對原始圖片進行resize,且分別使用不同的內插法,結果如下:
https://ithelp.ithome.com.tw/upload/images/20220912/20152370urhSaAzhQO.png
最左邊為原圖,中間為使用最鄰近內插放大兩倍,右邊為使用雙線性內插放大兩倍。
可以發現右邊的效果最好。而最鄰近內插的效果較差,馬賽克區塊較多。因此在數位影像的幾何轉換,雙線性內插法較為實用。


2.影像旋轉

影像旋轉是非常典型的轉換方法,定義如下:
![https://ithelp.ithome.com.tw/upload/images/20220912/20152370XuLsdmU2B9.png](https://ithelp.ithome.com.tw/upload/images/20220912/20152370XuLsdmU2B9.png)

由於這個公式的旋轉中心為原點(0,0),然而數位影像的原點在左上角,因此在實際過程中會將旋轉中心移至影像中心,且影像在旋轉後,部分區域可能會超出原本範圍。

程式碼如下:

import numpy as np
import cv2

img1 = cv2.imread("D:\Desktop\IThome\lena.bmp", -1)

nr2,nc2 = img1.shape[:2]

rotation_matrix = cv2.getRotationMatrix2D((nc2 / 2, nr2 / 2), 30, 1)
img2 = cv2.warpAffine(img1, rotation_matrix,(nc2, nr2))

cv2.imshow("Original", img1)
cv2.imshow("After", img2)

cv2.waitKey()
cv2.destroyAllWindows()

首先先定義影像中心為旋轉中心,以角度30度逆時針旋轉,接著呼叫OpenCV的仿射轉換涵式,即可取得旋轉後的數位影像,結果如下圖:
https://ithelp.ithome.com.tw/upload/images/20220912/20152370fu7ei6TM6P.png

詳細程式碼可到我的Github找到喔!
那麼今天到這告一段落,謝謝大家!


上一篇
[Day 4]影像的幾何轉換
下一篇
[Day 6]影像增強
系列文
數位影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言